Код:
//-----------------------------------------------------------------------------
// DKR EntityCustomData
//-----------------------------------------------------------------------------
// For: RPGMAKER MV, MZ
// DKR_EntityCustomData.js
//-----------------------------------------------------------------------------
// 15.01.2022 - Версия 1.0.0
//-----------------------------------------------------------------------------
// Поставляется AS-IS.
// Вся ответственность при использовании - на Пользователе!
//-----------------------------------------------------------------------------
var Imported = Imported || {};
Imported.DKR_EntityCustomData = true;
var DKR = DKR || {};
DKR.EntityCustomData = DKR.EntityCustomData || {};
DKR.EntityCustomData.version = 1.0;
//-----------------------------------------------------------------------------
/*:
* @plugindesc (v.1.0.0) Плагин позволяет хранить данные игрового объекта, привязанные к Эвенту или Картинке. Может быть полезен для мини-игр, пазлов, боёвок.
*
* @target MV, MZ
* @author DarchanKaen
*
* @help
* EntityCustomData
* ----------------------------------------------------------------------------
* ---Общая информация:
* Плагин позволяет хранить данные (например, состояние) игрового объекта, привязанные к Эвенту или Картинке.
* Также пожно искать необходимый объект данных и сохранять в переменной.
* Может быть полезен для мини-игр, пазлов, боёвок.
* Для полноценного использования нужно самое базовое знание JavaScript (создание и исп-е массивов и объектов)!
*
* Хранить можно любой тип данных (строка, число, массив, объект).
* Кол-во хранимых данных не ограничено.
* Списки (массивы) данных хранятся в 2-х переменных (для корректной работы при Сохранении/Загрузке игры).
*
* Например, мы можем хранить/обновлять/получать/удалять кол-во "ХП" у врага-эвента.
*
* При удалении Эвентов или Картинок из игры средствами мейкера, их объекты данных автоматом не удаляются!
* Удалить их нужно командой DKR.EntityCustomData.deleteCustomData(deleteCriteria); !!!
*
* ---Команды(в эвенте команда "Скрипт"):
* DKR.EntityCustomData.createCustomData(createCriteria); - создать объект данных.
* DKR.EntityCustomData.updateCustomData(updateCriteria); - обновить объект данных.
* DKR.EntityCustomData.getCustomData(searchCriteria, isWriteToVar); - получить объект данных.
* DKR.EntityCustomData.deleteCustomData(deleteCriteria); - удалить объект данных.
* где
* createCriteria, updateCriteria, searchCriteria, deleteCriteria - критерии создания / обновления / поиска / удаления объектов данных.
* isWriteToVar - true (записывать) или false (не записывать) найденный по критериям поиска объект данных в переменную.
*
* ОПИСАНИЕ "критериев"!!!
*
createCriteria = {
entityType: 'event-type',
searchType: 'search-type',
searchParams: [search-params],
customData: [ [name, value], ...., [nameN, valueN]]
}
updateCustomData = {
entityType: 'event-type',
searchType: 'search-type',
searchParams: [search-params],
updateType: 'update-type',
customData: [ [name, value], ...., [nameN, valueN]]
}
searchCriteria = {
entityType: 'event-type',
searchType: 'search-type',
searchParams: [search-params],
}
deleteCriteria = {
entityType: 'event-type',
searchType: 'search-type',
searchParams: [search-params],
}
* где
* 'event-type' - может быть или 'event' (для Эвента) или 'pic' для (Картинки).
* 'search-type' - можеть быть или 'id' (поиск по Id Эвента или номенку Картинки) или 'coords' (поиск по координатам).
* [search-params] - [Id Эвента ЛИБО номер Картинки] или [коордиана X, координата Y].
* 'update-type' - может быть или 'rew' (для перезаписи данных) или 'del' (для удаления данных; сам объект данных остается).
* [ [name, value], ...., [nameN, valueN]] - список данных в формате ['Ключ', значение] (например: [ ['ХП', 1325], ['Манна', 101]] )
*
* ----------------------------------------------------------------------------
*
* @param eventsCustomDataVarId
* @type variable
* @desc Номер переменной для сохранения Списка данных Эвентов.
* @default 71
*
* @param picsCustomDataVarId
* @type variable
* @desc Номер переменной для сохранения Списка данных Картинок.
* @default 72
*
* @param writeCustomDataVarId
* @type variable
* @desc Номер переменной для сохранения объекта данных по критериям поиска.
* @default 73
*
*/
//----INFO
/*
--createCriteria
{
entityType: 'event' OR 'pic'
searchType: 'id' OR 'coords'
searchParams: [] //id ([1]) OR coords [200, 300]
customData: [ [name, value],....,[nameN,valueN] ] (['hp', 99])
}
*/
/*
--searchCriteria OR deleteCriteria
{
entityType: 'event' OR 'pic'
searchType: 'id' OR 'coords'
searchParams: [] //id ([1]) OR coords [200, 300]
}
--updateCriteria
{
entityType: 'event' OR 'pic'
searchType: 'id' OR 'coords'
updateType: 'rew' OR 'del'
customData: [ [name, value],....,[nameN,valueN] ] (['hp', 99])
}
*/
( () => {
//----DATA
DKR.EntityCustomData.parameters = PluginManager.parameters('DKR_EntityCustomData');
let eventsCustomDataVarId = Number(DKR.EntityCustomData.parameters["eventsCustomDataVarId"]) || 71;
let picsCustomDataVarId = Number(DKR.EntityCustomData.parameters["picsCustomDataVarId"]) || 72;
let writeCustomDataVarId = Number(DKR.EntityCustomData.parameters["writeCustomDataVarId"]) || 73;
const ENTITY_TYPE_EVENT_CODEWORD = 'event';
const ENTITY_TYPE_PIC_CODEWORD = 'pic';
const ENTITY_SEARCH_ID_CODEWORD = 'id';
const ENTITY_SEARCH_COORDS_CODEWORD = 'coords';
const ENTITY_UPDATE_REWRITE_CODEWORD = 'rew';
const ENTITY_UPDATE_DELETE_CODEWORD = 'del';
//----
//----LOGIC - MAIN
//--test
const test = () => {
console.log('eventsCustomDataVarId:', eventsCustomDataVarId);
console.log('picsCustomDataVarId:', picsCustomDataVarId);
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
console.log('TEST___picsCustomData:');
console.log(picsCustomData);
console.log('TEST___eventsCustomData:');
console.log(eventsCustomData);
}
//--create new
const createEntityCustomData = (createCriteria) => {
//console.log('createCriteria:');
//console.log(createCriteria);
let gameEntity = getGameEntity(createCriteria);
let entityCustomData = null;
if(null === gameEntity || undefined === gameEntity){
console.log('DKR.EntityCustomData_ERROR: can not find game entity...search params are wrong!');
return;
}else{
if(ENTITY_TYPE_EVENT_CODEWORD === createCriteria.entityType){
let entitySelfId = gameEntity.eventId();
//entityCustomData = { entityType: createCriteria.entityType, entityId: entitySelfId, entityCustomData: createCriteria.customData};
entityCustomData = Object.fromEntries(createCriteria.customData);
entityCustomData.entityId = entitySelfId;
entityCustomData.entityType = createCriteria.entityType;
if( undefined === getEntityCustomData(createCriteria, false) ){
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
eventsCustomData.push(entityCustomData);
$gameVariables.setValue(eventsCustomDataVarId, eventsCustomData);
console.log('DKR.EntityCustomData_INFO: entity created');
}else{
console.log('DKR.EntityCustomData_ERROR: equal custom data entity already exist!');
}
}else if(ENTITY_TYPE_PIC_CODEWORD === createCriteria.entityType){
let entitySelfId = createCriteria.searchParams[0];
let entityType = createCriteria.entityType;
//entityCustomData = { entityType: createCriteria.entityType, entityId: entitySelfId, entityCustomData: createCriteria.customData};
entityCustomData = Object.fromEntries(createCriteria.customData);
entityCustomData.entityId = entitySelfId;
entityCustomData.entityType = createCriteria.entityType;
if( undefined === getEntityCustomData(createCriteria, false) ){
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
picsCustomData.push(entityCustomData);
$gameVariables.setValue(picsCustomDataVarId, picsCustomData);
console.log('DKR.EntityCustomData_INFO: entity created');
}else{
console.log('DKR.EntityCustomData_ERROR: equal custom data entity already exist!');
}
}else{
console.log('DKR.EntityCustomData_ERROR: unknown entity type "' + searchCriteria.entityType + '"...search params are wrong!');
return;
}
}
}
//--
//--update exist
const updateEntityCustomData = (updateCriteria) => {
let entityCustomData = getEntityCustomData(updateCriteria, false);
let entityIndex = -1;
if(null === entityCustomData || undefined === entityCustomData){
console.log('DKR.EntityCustomData_ERROR: can not find entity...search params are wrong!');
return;
}else{
if(ENTITY_TYPE_EVENT_CODEWORD === updateCriteria.entityType){
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
entityIndex = eventsCustomData.indexOf(entityCustomData);
}else if(ENTITY_TYPE_PIC_CODEWORD === updateCriteria.entityType){
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
entityIndex = picsCustomData.indexOf(entityCustomData);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown entity type "' + searchCriteria.entityType + '"...search params are wrong!');
return;
}
if(-1 === entityIndex){
console.log('DKR.EntityCustomData_ERROR: can not find entity...search params are wrong!');
return;
}else{
if(ENTITY_UPDATE_DELETE_CODEWORD === updateCriteria.updateType){
for(let n = 0; n < updateCriteria.customData.length; n++){
let keyName = updateCriteria.customData[n][0];
if(true === entityCustomData.hasOwnProperty(keyName)){
delete entityCustomData[keyName];
}
}
}else if(ENTITY_UPDATE_REWRITE_CODEWORD === updateCriteria.updateType){
for(let m = 0; m < updateCriteria.customData.length; m++){
let keyName = updateCriteria.customData[m][0];
let keyValue = updateCriteria.customData[m][1];
if(true === entityCustomData.hasOwnProperty(keyName)){
entityCustomData[keyName] = keyValue;
}
}
}
if(ENTITY_TYPE_EVENT_CODEWORD === updateCriteria.entityType){
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
eventsCustomData[entityIndex] = entityCustomData;
$gameVariables.setValue(eventsCustomDataVarId, eventsCustomData);
}else if(ENTITY_TYPE_PIC_CODEWORD === updateCriteria.entityType){
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
picsCustomData[entityIndex] = entityCustomData;
$gameVariables.setValue(picsCustomDataVarId, picsCustomData);
}
console.log('DKR.EntityCustomData_INFO: entity updated');
}
}
}
//--
//--delete exist entity (FULL DELETE)
const deleteEntityCustomData = (deleteCriteria) => {
let entityCustomData = getEntityCustomData(deleteCriteria, false);
let entityIndex = -1;
if(null === entityCustomData || undefined === entityCustomData){
console.log('DKR.EntityCustomData_ERROR: can not find entity...search params are wrong!');
return;
}else{
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
if(ENTITY_TYPE_EVENT_CODEWORD === deleteCriteria.entityType){
entityIndex = eventsCustomData.indexOf(entityCustomData);
if(-1 === entityIndex){
console.log('DKR.EntityCustomData_ERROR: can not find entity...search params are wrong!');
return;
}
delete eventsCustomData[entityIndex];
eventsCustomData = eventsCustomData.filter( elem => elem );
$gameVariables.setValue(eventsCustomDataVarId, eventsCustomData);
}else if(ENTITY_TYPE_PIC_CODEWORD === deleteCriteria.entityType){
entityIndex = picsCustomData.indexOf(entityCustomData);
if(-1 === entityIndex){
console.log('DKR.EntityCustomData_ERROR: can not find entity...search params are wrong!');
return;
}
delete picsCustomData[entityIndex];
picsCustomData = picsCustomData.filter( elem => elem );
$gameVariables.setValue(picsCustomDataVarId, picsCustomData);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown entity type "' + searchCriteria.entityType + '"...search params are wrong!');
return;
}
console.log('DKR.EntityCustomData_INFO: entity deleted');
}
}
//--search exist
const getEntityCustomData = (searchCriteria, writeDataInVar) => {
//console.log('searchCriteria:');
//console.log(searchCriteria);
let dataList = [];
let entityCustomData = null;
if(ENTITY_TYPE_EVENT_CODEWORD === searchCriteria.entityType){
let eventsCustomData = $gameVariables.value(eventsCustomDataVarId) || [];
dataList = eventsCustomData;
}else if(ENTITY_TYPE_PIC_CODEWORD === searchCriteria.entityType){
let picsCustomData = $gameVariables.value(picsCustomDataVarId) || [];
dataList = picsCustomData;
}else{
console.log('DKR.EntityCustomData_ERROR: unknown entity type "' + searchCriteria.entityType + '"...search params are wrong!');
}
if(ENTITY_SEARCH_ID_CODEWORD === searchCriteria.searchType){
entityCustomData = getEntityCustomDataById(dataList, searchCriteria);
}else if(ENTITY_SEARCH_COORDS_CODEWORD === searchCriteria.searchType){
entityCustomData = getEntityCustomDataByCoords(dataList, searchCriteria);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown search type "' + searchCriteria.searchType + '"...search params are wrong!');
}
//console.log('entityCustomData:');
//console.log(entityCustomData);
if(true === writeDataInVar){
$gameVariables.setValue(writeCustomDataVarId, entityCustomData);
}
if(null === entityCustomData || undefined === entityCustomData){
console.log('DKR.EntityCustomData_INFO: no entities found');
}else{
console.log('DKR.EntityCustomData_INFO: some entities found correct');
}
return entityCustomData;
}
const getEntityCustomDataById = (dataList, searchCriteria) => {
let searchResult = null;
let searchId = searchCriteria.searchParams[0];
searchResult = dataList.filter(entity => entity.entityId === searchId)[0];
return searchResult;
}
const getEntityCustomDataByCoords = (dataList, searchCriteria) => {
let searchResult = null;
let searchCoordX = searchCriteria.searchParams[0];
let searchCoordY = searchCriteria.searchParams[1];
for(let n = 0; n < dataList.length; n++){
let entity = dataList[n];
let gameEntity = null;
if(ENTITY_TYPE_EVENT_CODEWORD === searchCriteria.entityType){
gameEntity = getGameEntity(searchCriteria);
//console.log('__CURRENT_GAME_EVENT_SEARCH_ENTITY:', gameEntity);
}else if(ENTITY_TYPE_PIC_CODEWORD === searchCriteria.entityType){
gameEntity = getGameEntity(searchCriteria);
//console.log('__CURRENT_GAME_PIC_SEARCH_ENTITY:', gameEntity);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown search type "' + searchCriteria.searchType + '"...search params are wrong!');
}
if(null === gameEntity || undefined === gameEntity){
console.log('DKR.EntityCustomData_ERROR: can not find game entity...search params are wrong!');
}else{
//console.log('__gameEntity:', gameEntity);
if(gameEntity._x === searchCoordX && gameEntity._y === searchCoordY){
searchResult = entity;
}
}
}
return searchResult;
}
//--
//----
//----LOGIC - UTILS
const getGameEntity = (findCriteria) => {
let gameEntity = null;
if(ENTITY_TYPE_EVENT_CODEWORD === findCriteria.entityType){
if(ENTITY_SEARCH_ID_CODEWORD === findCriteria.searchType){
gameEntity = getGameEventById(findCriteria.searchParams[0]);
}else if(ENTITY_SEARCH_COORDS_CODEWORD === findCriteria.searchType){
gameEntity = getGameEventByCoords(findCriteria.searchParams);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown search type "' + findCriteria.searchType + '"...search params are wrong!');
}
}else if(ENTITY_TYPE_PIC_CODEWORD === findCriteria.entityType){
if(ENTITY_SEARCH_ID_CODEWORD === findCriteria.searchType){
gameEntity = getGamePictureById(findCriteria.searchParams[0]);
}else if(ENTITY_SEARCH_COORDS_CODEWORD === findCriteria.searchType){
gameEntity = getGamePictureByCoords(findCriteria.searchParams);
}else{
console.log('DKR.EntityCustomData_ERROR: unknown search type "' + findCriteria.searchType + '"...search params are wrong!');
}
}else{
console.log('DKR.EntityCustomData_ERROR: unknown entity "' + findCriteria.entityType + '" type...search params are wrong!');
}
return gameEntity;
}
const getGameEventById = (gameEventId) => {
let gameEvent = null;
gameEvent = $gameMap.event(gameEventId);
return gameEvent;
}
const getGameEventByCoords = (gameEventCoordsList) => {
let gameEvent = null;
let xCoord = gameEventCoordsList[0];
let yCoord = gameEventCoordsList[1];
gameEvent = $gameMap.eventsXy(xCoord, yCoord)[0];
return gameEvent;
}
const getGamePictureById = (gamePictureId) => {
let gamePicture = null;
gamePicture = $gameScreen._pictures[gamePictureId];
return gamePicture;
}
const getGamePictureByCoords = (gamePictureCoordsList) => {
let gamePicture = null;
let xCoord = gamePictureCoordsList[0];
let yCoord = gamePictureCoordsList[1];
gamePicture = $gameScreen._pictures.filter(picture => picture._x === xCoord && picture._y === yCoord)[0];
return gamePicture;
}
//----
//----COMMANDS
DKR.EntityCustomData.test = function(){
test();
}
DKR.EntityCustomData.createCustomData = function(createCriteria){
createEntityCustomData(createCriteria);
}
DKR.EntityCustomData.getCustomData = function(searchCriteria, writeDataInVar = false){
return getEntityCustomData(searchCriteria, writeDataInVar);
}
DKR.EntityCustomData.updateCustomData = function(updateCriteria){
updateEntityCustomData(updateCriteria);
}
DKR.EntityCustomData.deleteCustomData = function(deleteCriteria){
deleteEntityCustomData(deleteCriteria);
}
//----
} )();
Социальные закладки